# Copyright 2021 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# This makefile is run by the ./ci/crosvm_* containers to build native third
# party dependencies required by crosvm.
#
# Setting TARGET_ARCH=aarch64 enables cross-compilation for aarch64.

SRC ?= /workspace/src/crosvm
BUILD ?= /workspace/scratch/build
LIB ?= /workspace/scratch/lib
TARGET_ARCH ?=

MAKEFILE_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))

ifeq ($(TARGET_ARCH),aarch64)
CROSS_COMPILE = aarch64-linux-gnu-
MESON_ARGS = --cross-file $(BUILD)/meson-cross
else
CROSS_COMPILE =
MESON_ARGS =
endif


all: $(LIB) tpm2 minijail minigbm virglrenderer
	ldconfig $(LIB)

clean:
	rm -rf $(BUILD) $(LIB)

# Targets to build the needed chromiumos projects.
#
# These are phony targets so that we can delegate the dirty-check to the
# underlying build system for each library.

tpm2:
	mkdir -p $(BUILD)/tpm2
	$(MAKE) -C $(SRC)/tpm2-sys/libtpm2 \
		obj=$(BUILD)/tpm2 \
		AR=$(CROSS_COMPILE)ar \
		CC=$(CROSS_COMPILE)gcc \
		OBJCOPY=$(CROSS_COMPILE)objcopy V=1

minijail:
	mkdir -p $(BUILD)/minijail
	$(MAKE) -C $(SRC)/third_party/minijail \
		OUT=$(BUILD)/minijail \
		CROSS_COMPILE=$(CROSS_COMPILE)

minigbm:
	mkdir -p $(BUILD)/minigbm
	$(MAKE) -C $(SRC)/third_party/minigbm \
		OUT=$(BUILD)/minigbm  \
		CROSS_COMPILE=$(CROSS_COMPILE)

virglrenderer: minigbm $(BUILD)/meson-cross
	meson setup \
		$(BUILD)/virglrenderer \
		$(SRC)/third_party/virglrenderer \
		$(MESON_ARGS)

	CPATH=$(SRC)/third_party/minigbm \
		meson compile -C $(BUILD)/virglrenderer


# File needed by meson for cross-compilation.
$(BUILD)/meson-cross:
ifeq ($(TARGET_ARCH),aarch64)
	mkdir -p $(BUILD)
	/usr/share/meson/debcrossgen --arch arm64 -o $@
else
	mkdir -p $(BUILD)
	touch $@
endif

# Sets up the $(LIB) directory with links to the generated binaries in $(BUILD).
$(LIB):
	mkdir -p $(LIB) $(LIB)/pkgconfig

	# tpm2
	ln -sf $(BUILD)/tpm2/libtpm2.a $(LIB)/libtpm2.a
	ln -sf $(MAKEFILE_DIR)/pkgconfig/libtpm2.pc $(LIB)/pkgconfig/

	# minijail
	ln -sf $(BUILD)/minijail/libminijail.so $(LIB)
	ln -sf $(LIB)/libminijail.so $(LIB)/libminijail.so.1
	ln -sf $(MAKEFILE_DIR)/pkgconfig/libminijail.pc $(LIB)/pkgconfig/

	# minigbm
	ln -sf $(BUILD)/minigbm/libminigbm.so.1.0.0 $(LIB)/libgbm.so
	ln -sf $(LIB)/libgbm.so $(LIB)/libgbm.so.1
	ln -sf $(SRC)/third_party/minigbm/gbm.pc $(LIB)/pkgconfig/

	# virglrenderer
	ln -sf $(BUILD)/virglrenderer/src/libvirglrenderer.so $(LIB)
	ln -sf $(LIB)/libvirglrenderer.so $(LIB)/libvirglrenderer.so.1
	ln -sf $(BUILD)/virglrenderer/virglrenderer.pc $(LIB)/pkgconfig/

.PHONY: all clean tpm2 minijail sysroot minigbm virglrenderer
